Nesne Yapılandırıcılar
Java'da bir nesne oluşturulduğunda, nesne yapısının ilk kez oluşturulmasını sağlayan özel bir metod olan nesne yapılandırıcısı (constructor) kullanılır. Nesne yapısının oluşturulması için sınıfın adı ve nesne yapılandırıcısı kullanılarak new anahtar sözcüğü ile bir nesne örneği oluşturulur.
Java'da bir sınıfın nesne yapılandırıcısı aşağıdaki gibi tanımlanır:
public class MyClass {
public MyClass() {
// Yapılandırıcı kodları
}
}
Yukarıdaki örnekte, MyClass adlı sınıfın bir nesne yapılandırıcısı tanımlanmıştır. Yapılandırıcı, sınıfın adıyla aynıdır ve geri dönüş tipi yoktur. Yapılandırıcı kodları nesne oluşturulduğunda otomatik olarak çalışır ve nesnenin ilk durumunu belirler.
Nesne yapılandırıcıları ayrıca parametre alabilen yapılandırıcılardır. Bu tür yapılandırıcılar, nesnenin oluşturulması sırasında belirtilen parametreleri kullanarak nesnenin özelliklerini belirleyebilirler. Aşağıdaki örnek, MyClass sınıfının parametre alan bir nesne yapılandırıcısı örneğidir:
public class MyClass {
private int myNumber;
public MyClass(int number) {
myNumber = number;
}
public int getMyNumber() {
return myNumber;
}
}
Yukarıdaki örnekte, MyClass adlı sınıfın bir parametre alan yapılandırıcısı tanımlanmıştır. Yapılandırıcı, int türünde bir parametre alır ve myNumber adlı özellikle nesnenin özelliklerini belirler. Ayrıca, getMyNumber adlı bir metot nesnenin myNumber özelliğine erişmek için kullanılabilir.
Nesne yapılandırıcıları, nesnenin ilk durumunu belirlemek için kullanılır ve sınıfın yapısına göre farklı şekillerde tanımlanabilirler. Nesne yapılandırıcıları, sınıfın nesne oluşturulduğunda hangi parametrelerin kullanılacağını ve nesnenin hangi özelliklerinin belirleneceğini belirlerler.
Adaş Yordamlar
Java'da adaş yordamlar (overloaded methods), aynı sınıf içinde aynı isimle birden fazla yordamın tanımlanmasıdır. Adaş yordamların farklı parametre listeleri olmalıdır.
Örneğin, aşağıdaki örnekte, Java'da bir sınıf içinde iki tane adaş yordam tanımlanmıştır:
public class MyClass {
public void yazdir(int sayi) {
System.out.println("Sayı: " + sayi);
}
public void yazdir(String metin) {
System.out.println("Metin: " + metin);
}
}
Yukarıdaki örnekte, MyClass adlı sınıf içinde, iki farklı parametre listesi olan iki tane adaş yordam tanımlanmıştır: biri bir tamsayı parametresi alırken, diğeri bir metin (string) parametresi almaktadır. İki yordamın da adı yazdir'dir, ancak parametreleri farklıdır.
Adaş yordamların kullanımı, aynı işlevi farklı türde veya sayıda parametrelerle çalıştırmak istediğimiz durumlarda yararlıdır. Örneğin, yukarıdaki örnekte, yazdir yordamı, hem bir tamsayı hem de bir metin parametresi alabilir. Bu, yazdırılacak verinin türüne bağlı olarak farklı parametreler kullanarak kod tekrarını önlemek için kullanışlı bir tekniktir.
Java'da, yordamların adaşı, parametrelerin sayıları ve türleri gibi parametre listesiyle belirlenir. Adaş yordamların geri dönüş türü aynı olabilir veya farklı olabilir. Yordamın adının ve parametre listesinin belirli bir sıraya göre belirlenmesi, Java'nın derleyicisi tarafından yönetilmektedir.
Varsayılan Yapılandırıcılar
Java'da varsayılan yapılandırıcılar (default constructors), sınıfların özel bir türüdür ve sınıfın adı ve hiçbir parametre almazlar. Varsayılan yapılandırıcı, sınıfın bir örneği oluşturulduğunda otomatik olarak çağrılır.
Java'da bir sınıf tanımlandığında, herhangi bir yapılandırıcı tanımlanmazsa, Java, sınıfın varsayılan bir yapılandırıcısı olduğunu varsayar ve otomatik olarak bir tane oluşturur. Varsayılan yapılandırıcının gövdesi, hiçbir işlem yapmayan boş bir gövdedir.
Örneğin, aşağıdaki kod örneğinde, MyClass adlı bir sınıf tanımlanmış ve herhangi bir yapılandırıcı tanımlanmamıştır:
public class MyClass {
// Herhangi bir yapılandırıcı tanımlanmamıştır.
}
Yukarıdaki örnekte, MyClass adlı sınıfın, hiçbir parametre almayan varsayılan bir yapılandırıcısı vardır. Bu yapılandırıcı, bir MyClass nesnesi oluşturulduğunda otomatik olarak çağrılır.
Varsayılan yapılandırıcı, sınıfın alanlarının varsayılan değerlerini de ayarlar. Örneğin, bir sınıfın bir tamsayı alanı, varsayılan olarak sıfır (0) değerine ayarlanır. Böylece, sınıfın bir örneği oluşturulduğunda, tüm alanlar varsayılan değerlerine sahip olacaktır.
Varsayılan yapılandırıcının yerine özel bir yapılandırıcı tanımlanabilir. Ancak, özel bir yapılandırıcı tanımlandığında, varsayılan yapılandırıcının otomatik olarak oluşturulması durdurulur.
Özetle, Java'da varsayılan yapılandırıcılar, sınıfın özel bir türüdür ve sınıfın adı ve hiçbir parametre almazlar. Varsayılan yapılandırıcı, sınıfın bir örneği oluşturulduğunda otomatik olarak çağrılır ve sınıfın alanlarının varsayılan değerlerini ayarlar.
This Sözcüğü
Java'da "this" anahtar sözcüğü, bir sınıfın öğeleriyle (alanları, yöntemleri vb.) ilgili olan bir referanstır. Bu anahtar sözcük, "bu" anlamına gelir ve bir nesnenin kendisine referans oluşturmak için kullanılır.
this anahtar sözcüğünün kullanımı aşağıdaki durumlarda yaygın olarak kullanılır:
- Alan ve Yöntem Adları: Bir sınıfın alan adı ve yerel değişken adı aynı olabilir. Bu durumda, alanın değeri yerine yerel değişkenin değeri atanır. Bu sorunu çözmek için, "this" anahtar sözcüğü kullanılır. Örneğin:
public class Person {
private String name;
public void setName(String name) {
this.name = name; // "this" anahtar sözcüğü kullanarak "name" alanına atama yapılır.
}
}
- Yapılandırıcı Çağrıları: Bir sınıfın yapıcı metodu içinde, aynı sınıftan başka bir yapıcıyı çağırmak isteyebilirsiniz. Bu durumda, "this" anahtar sözcüğü kullanarak diğer yapıcıyı çağırabilirsiniz. Ancak, bu durumda "this" anahtar sözcüğü yapıcı metodun ilk satırında kullanılmalıdır. Örneğin:
public class Person {
private String name;
private int age;
public Person() {
this("John Doe", 0); // "this" anahtar sözcüğü kullanarak diğer yapıcıyı çağırır.
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
- İç İçe Sınıflar: Bir sınıfın içinde başka bir sınıf tanımlayabilirsiniz. Bu durumda, iç sınıfın dış sınıfa erişimi vardır ve "this" anahtar sözcüğü kullanarak dış sınıfa erişebilir. Örneğin:
public class OuterClass {
private int x;
public class InnerClass {
public void innerMethod() {
System.out.println("x değeri: " + OuterClass.this.x); // "this" anahtar sözcüğü kullanarak dış sınıfa erişilir.
}
}
}
Bu örneklerde, "this" anahtar sözcüğü, bir sınıfın öğeleriyle ilgili bir referans oluşturmak için kullanılır. Alan ve yöntem adları çakışması durumunda, yapıcı metotlarının çağrılmasında ve iç içe sınıflarda dış sınıfa erişimde kullanılabilir.
Statik Alanlar
Java'da "static" anahtar kelimesi, bir sınıfın öğelerinin statik olduğunu belirtmek için kullanılır. "static" anahtar kelimesi, alanlar ve yöntemler için kullanılabilir.
Statik alanlar, sınıf seviyesinde bir değişken olarak tanımlanır ve tüm nesneler arasında paylaşılır. Statik bir alan, sınıfın ilk kez yüklendiği anda oluşturulur ve tüm sınıfın öğeleri tarafından erişilebilir. Bu nedenle, statik alanlar, özellikle sabitler için kullanışlıdır.
Statik alanlar, bir sınıftan örnek oluşturmadan kullanılabilirler. Bununla birlikte, statik bir alana nesne referansı kullanarak erişilemez. Statik bir alan, sınıfın adıyla doğrudan erişilebilir. Aşağıdaki örnekte, "count" isimli bir statik alan kullanılmıştır:
public class Person {
private String name;
private int age;
private static int count = 0;
public Person(String name, int age) {
this.name = name;
this.age = age;
count++; // her yeni nesne oluşturulduğunda "count" değişkeni arttırılır
}
public static int getCount() {
return count; // "count" değişkeni statik olduğu için "getCount()" yöntemi de statik olmalıdır
}
}
Bu örnekte, "count" isimli statik bir alan tanımlanmış ve her yeni nesne oluşturulduğunda arttırılmıştır. "getCount()" adlı bir statik yöntem, "count" değişkeninin değerini döndürür. Bu yöntem, sınıf adıyla doğrudan çağrılabilir.
Statik alanlar ayrıca, sabitlerin tanımlanması için de kullanılabilir. Sabitler, bir kez değer atandıktan sonra değiştirilemeyen alanlardır ve sınıf seviyesinde tanımlanırlar. Sabitler, genellikle büyük harfle yazılan isimlerle tanımlanır. Aşağıdaki örnekte, "PI" sabiti tanımlanmıştır:
public class Circle {
private double radius;
public static final double PI = 3.14;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return PI * radius * radius;
}
}
Bu örnekte, "PI" isimli bir sabit tanımlanmış ve "getArea()" yöntemi içinde kullanılmıştır. "PI" sabiti, "final" anahtar kelimesiyle birlikte tanımlanmıştır, bu nedenle, değeri bir kez atandıktan sonra değiştirilemez.
Statik Yordamlar
Java'da "static" anahtar kelimesi, bir sınıfın öğelerinin statik olduğunu belirtmek için kullanılır. "static" anahtar kelimesi, yöntemler ve alanlar için kullanılabilir. Statik yöntemler, sınıf seviyesinde tanımlanır ve nesne oluşturulmadan kullanılabilirler.
Statik yöntemler, sınıfın herhangi bir nesnesi olmadan çağrılabilirler. Bununla birlikte, statik bir yöntem, nesne referansı kullanarak çağrılamaz. Statik yöntemler, sınıf adıyla doğrudan çağrılır. Aşağıdaki örnekte, "sum()" adlı bir statik yöntem kullanılmıştır:
public class Calculator {
public static int sum(int a, int b) {
return a + b;
}
}
Bu örnekte, "sum()" adlı bir statik yöntem tanımlanmıştır. Bu yöntem, iki tam sayı parametresi alır ve bu sayıların toplamını döndürür. Bu yöntem, sınıf adıyla doğrudan çağrılabilir.
Statik yöntemler, genellikle yardımcı yöntemler, sabitler veya veri erişimi yöntemleri gibi durumlarda kullanılır. Statik yöntemlerin kullanımı, özellikle performans gereksinimleri veya nesne oluşturma maliyeti gibi faktörler nedeniyle, bazı durumlarda tercih edilir.
Statik yöntemler ayrıca, bir sınıfın tüm örneklerine erişebilen veya paylaşılan bir özelliği uygulamak için kullanılabilirler. Bu, sınıfın örnekleri arasında veri paylaşımını kolaylaştırabilir ve kod tekrarını azaltabilir.
Sonuç olarak, statik yöntemler, sınıf seviyesinde tanımlanan yöntemlerdir ve nesne oluşturulmadan kullanılabilirler. Statik yöntemler, genellikle yardımcı yöntemler veya veri erişimi yöntemleri gibi durumlarda kullanılır.
Finalize() Metodu
Java'da "finalize()" adlı bir metot, nesne ömrü sonlandığında çalıştırılan özel bir metottur. Bu metot, bir nesnenin artık kullanılmadığı ve bellekten geri alınabileceği zaman çağrılır. Finalize metodu, "Object" sınıfında tanımlanmıştır ve herhangi bir sınıf tarafından ezilebilir.
Finalize metodu, nesnenin bellekten geri alınmadan önce son bir işlem yapmasına izin verir. Bu işlemler arasında dosya veya ağ bağlantıları kapatmak, kaynakları serbest bırakmak veya herhangi bir temizleme işlemi yapmak gibi işlemler yer alabilir. Ancak, bu metotun kullanımı önerilmez ve yalnızca belirli durumlarda gereklidir.
Finalize metodu, nesne ömrü sonlandığında otomatik olarak çağrılır. Bu nedenle, JVM tarafından belirli bir zaman aralığında çalıştırılabilir ve bu nedenle nesnenin hemen bellekten geri alınmasını engelleyebilir. Bu da, gereksiz bellek kullanımına neden olabilir ve performans sorunlarına yol açabilir.
Java 9'dan itibaren, "finalize()" metodu kullanımı önerilmemektedir. Bunun yerine, "try-with-resources" blokları veya "close()" metodu gibi alternatif yaklaşımlar kullanılabilir. Bu yaklaşımlar, kaynakların otomatik olarak kapatılmasını sağlar ve daha güvenli bir bellek yönetimi sağlar.
Sonuç olarak, "finalize()" metodu, nesne ömrü sonlandığında çağrılan özel bir metottur. Bu metot, bir nesnenin bellekten geri alınmadan önce son bir işlem yapmasına izin verir. Ancak, bu metotun kullanımı önerilmemektedir ve alternatif yaklaşımlar tercih edilmelidir.
Nesne Değişkenlerine Değer Atanması
Java'da nesne değişkenlerine değer atanması, bir nesne oluşturulduğunda veya bir sınıftan türetilen bir nesne oluşturulduğunda gerçekleştirilir. Nesne değişkenleri, bir sınıf içinde tanımlanan ve o sınıfın nesneleri için özgü değerleri tutan değişkenlerdir.
Nesne değişkenlerine değer atama, öncelikle bir nesne oluşturulmasıyla gerçekleştirilir. Bu işlem, sınıfın constructor (yapılandırıcı) metotlarından biri aracılığıyla yapılır. Constructor metotları, bir nesne oluşturulduğunda otomatik olarak çağrılan özel metotlardır ve nesne değişkenlerine başlangıç değerleri atanabilir.
Aşağıdaki örnek, bir "Person" sınıfı tanımlar ve nesne değişkenlerine değer atanması için bir constructor metodu kullanır:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter ve setter metotları burada olabilir
}
Yukarıdaki kodda, "Person" sınıfı iki nesne değişkeni içerir: "name" ve "age". Constructor metodu, bu değişkenlere değer atamak için kullanılır. Bu örnekte, constructor metodu, "name" ve "age" değişkenlerine parametre olarak geçirilen değerleri atar.
Constructor metodu ayrıca, nesne değişkenlerine başlangıç değerleri atanmadan önce diğer işlemler de gerçekleştirebilir. Örneğin, "Person" sınıfının constructor metodu, parametre olarak geçilen yaş değerinin geçerli bir değer olup olmadığını kontrol edebilir.
Ayrıca, nesne değişkenlerine değer atanması, constructor metodu dışında da gerçekleştirilebilir. Bu durumda, nesne değişkenleri varsayılan başlangıç değerleri ile atanır. Örneğin, "String" türünde bir nesne değişkeni varsayılan olarak "null" değerini alırken, "int" türünde bir nesne değişkeni varsayılan olarak "0" değerini alır.
Sonuç olarak, Java'da nesne değişkenlerine değer atanması, bir constructor metodu aracılığıyla gerçekleştirilir. Bu metot, nesne oluşturulduğunda otomatik olarak çağrılır ve nesne değişkenlerine başlangıç değerleri atanabilir. Ancak, nesne değişkenleri varsayılan olarak da başlangıç değerleri ile atanabilir.